package br.com.fieo.sgee.dao;

import br.com.fieo.sgee.model.ConsumptionsEstimatesKwhs;
import br.com.fieo.sgee.model.Estimate;
import br.com.fieo.sgee.model.TypeOfPoint;
import br.com.fieo.sgee.model.Kwh;
import br.com.fieo.sgee.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 * Classe responsável pela conecção e comunicação com o banco de dados
 * 
 * @author rbueno
 */
public class DaoFactory {

    /** Sessão de conecção do hibernate */
    private final Session session;
    /** Transação com o banco de dados */
    private Transaction transaction;

    /**
     * Contrutor de uma Factory de Dao
     */
    public DaoFactory() {
        session = HibernateUtil.getSession();
    }

    /**
     * Método responsável por abrir uma transação com o banco de dados
     */
    public void beginTransaction() {
        this.transaction = this.session.beginTransaction();
    }

    /**
     * Método resposável por finalizar a alteração realizada em uma transação
     */
    public void commit() {
        this.transaction.commit();
        this.transaction = null;
    }

    /**
     * Verifica se já existe uma transação aberta
     * @return verdadeiro caso exista uma transação
     */
    public boolean hasTransaction() {
        return this.transaction != null;
    }

    /**
     * Retorna tudo o que foi feito na transação caso ocorra algum problema
     */
    public void rollback() {
        if (this.hasTransaction()) {
            this.transaction.rollback();
            this.transaction = null;
        }
    }

    /**
     * Fecha a conecção com o banco de dados
     */
    public void close() {
        if (this.session.isOpen()) {
            this.session.close();
        }
    }

    /**
     * Método responsável por criar uma DAO de Usuário
     * @return Uma classe DAO de Usuário
     */
    public UserDAO getUsuarioDao() {
        return new UserDAO(this.session);
    }

    /**
     * criar uma DAO de estimativa
     * @return Uma classe DAO de estimativa
     */
    public Dao<Estimate> getEstimateDao() {
        return new Dao<Estimate>(this.session, Estimate.class);
    }

    public Dao<TypeOfPoint> getTypeOfPointDao(){
        return new Dao<TypeOfPoint>(this.session, TypeOfPoint.class);
    }

    public Dao<Kwh> getKwhDAO(){
        return new Dao<Kwh>(this.session, Kwh.class);
    }

    /**
     * criar uma DAO de estimativa, consumos e kwhs
     * @return Uma classe DAO de estimativa consumos e kwhs
     */
    public Dao<ConsumptionsEstimatesKwhs> getConsumptionsEstimatesKwhsDao() {
        return new Dao<ConsumptionsEstimatesKwhs>(this.session, ConsumptionsEstimatesKwhs.class);
    }
    
}
